Descrição da página

Este projeto buscou dados encontrados na página da Câmara Municipal do Rio de Janeiro http://www.camara.rj.gov.br/.

Esta página disponibiliza diversas informações a respeito da produção e atividade dos veradores da cidade. Ela é atualizada sempre que necessário com todos os materiais das atividades das Sessões Plenárias.

A escolha desta página para análise foi motivada pela falta de recursos facilmente acessíveis para que a população acompanhe um resumo da atividade parlamentar do município do Rio de Janeiro.

As informações aqui apresentadas se referem à 10ª Legislatura, que compreende o os anos de 2017 a 2020.

Será apresentada a composição atual da Câmara Municipal, a frequência dos parlamentares e as atividades realizadas durante este período.

Em relação à atividade parlamentar, buscou-se informações a respeito de Projetos de Emenda à Lei Orgânica, Projetos de Lei Complementar, Projetos de Lei, Projetos de Decreto Legislativo, Projetos de Resolução, Indicações, Moções, Requerimentos de Informação e Requerimentos e Ofícios. Também foram coletadas as Leis Complementares e Emendas à Lei Orgânica que entraram em vigor no período especificado.

Fluxo do webscrapping

Em geral, todas as páginas coletadas para as Matérias Legislativas e Legislação Municipal apresentaram uma estrutura similar. Para exemplificar, irei apresentar a raspagem feita na página de Projetos de Lei.

O site oferece as informações organizadas por número, por ano, ou por autor. Como o interesse do projeto é buscar os dados por ano, para facilitar a filtragem do material desejado a raspagem foi realizada pela aba POR ANO para a maioria das matérias legislativas, excetuando-se algumas que apresentaram uma estrutura diferente das demais.

As páginas puderam ser acessadas com uma simples requisição GET, sem a necessidade de se incluírem parâmetros adicionais. A página principal de exibição dos resultados não nos mostra todos, sendo necessário ir clicando em “próximo” até se obter todos os resultados do ano desejado.

Bibliotecas utilizadas

library(tidyverse)
## Warning: package 'tibble' was built under R version 4.0.3
library(rvest)
library(httr)
library(lubridate)
library(knitr)
## Warning: package 'knitr' was built under R version 4.0.3
library(kableExtra)

Headers de requisição

  u_base <- "https://mail.camara.rj.gov.br/APL/Legislativos/scpro1720.nsf/Internet/LeiEmentaInt"
  q_base <- list(
    "OpenForm" = "",
    "Start" = 1,   # Número da página atual.
    "Count" = 100, # Quantidade de resultados apresentados na página.
    "Expand" = 1   # Índice do ano (Se descendente, 1 para 2020, 2 para 2019...)
  )
  get_materia <- GET(u_base, query = q_base)

O valor de Start para a troca de página segue uma lógica pouco intuitiva. No exemplo acima, a primeira página começa em 1, a seguinte é 1.99, depois 1.198, 1.297, 1.396, acrescentando 1 após o decimal e diminuindo 1 do último número. Para contornar este problema, optei por modificar o valor de Count para 1000, já que assim conseguiria que a página me retornasse todos os resultados e, verificando que nenhuma ano retornava mais do que 1000 resultados, esta solução foi suficiente para obter os dados desejados.

Raspagem dos dados

Matérias Legislativas e Legislação Municipal

As informações a respeito dos Projetos de Lei e demais matérias são apresentadas no formato de tabela. Assim, foi feita uma leitura do html da página por meio da função xml2::read_html(get_materia), seguida de uma busca por todas as tabelas com xml2::xml_find_all('//table'):

read_html(get_materia) %>%  # lê o html da página
    xml_find_all('//table') %>% # busca os nodes do tipo table
    magrittr::extract2(2) %>%   # extrai o segundo node, que contém a tabela principal
    html_table(fill = TRUE) %>% # leitura da tabela
    janitor::clean_names() %>%  # renomeia as colunas para um formato mais fácil de leitura e manipulação
    select(c("x_2", "ementa", "data_publ", "autor_es")) %>% # seleciona apenas as colunas com as informações desejadas. o restante é 'lixo'
    set_names(c("prolei_num", "ementa", "data_publi", "autores")) %>% # renomeia as colunas para nomes mais amigáveis
    as_tibble() %>% # transforma o dataframe em tibble
    separate_rows(autores, sep = ",") %>% # separa autores do projeto em uma linha para cada. a maioria está separada por "," mas ainda há alguns nomes separados por "E" e que devem ser corrigidos depois (não foram neste projeto)
    filter(str_detect(ementa, "^[A-Z]")) %>% # verifica na coluna ementa apenas as linhas que começam por letras. Há linhas com NAs e o ano que não correspondem à observações com informações
    mutate(data_publi = mdy(data_publi), # este mutate transforma a data de character 
           ementa = str_squish(ementa),  # para date; elimina "sujeiras" no texto da
           autores = str_to_title(autores), # ementa; torna maiúsculos apenas o nome e 
           autores = str_remove(autores, "(Vereador)(a*) ")) # sobrenome dos autores;
# e retira o título vereador/Vereadora da frente do nome. 
# Estes dois últimos passos do mutate são importantes para unificar posteriormente 
# este dataframe com o dataframe contendo as informações dos candidatos.

Projeto de Decreto Legislativo e Projeto de Resolução

Para estas duas categorias foi necessário extrair os dados a partir da aba POR NÚMERO. Para o Projetos de Decreto Legislativo a aba POR ANO não retornava o nome do(s) autor(es) e para o Projeto de Resolução, o site direciona para a página de Projetos de Lei. O modo de requisição dos dados foi basicamente o mesmo. Sendo alterada apenas a iteração das páginas para Start ao invés de Expand. Como são poucas páginas com resultados, de forma não ideal, coletei manualmente os valores de Expand para cada página.

Vereadores Atuais

Os resultados da página de veradores atuais também estão dispostos no formato table, exigindo apenas uma busca para nodes deste tipo. No entanto, a foto e o partido dos veradores não é retornado na tabela principal, necessitando que fossem buscados de forma separada por meio da classe e fossem extraídas as informações desejadas contidas nos atributos

u_ver <- "http://www.camara.rj.gov.br/vereadores_atuais.php?m1=vereadores&m2=ver_atuais&m3=por_nome"

partidos <- read_html(u_ver) %>% 
  xml_find_all("//td[@class='td3']//img") %>% 
  xml_attr("title") %>% 
  str_squish()

foto_vereador <- read_html(u_ver) %>% 
  xml_find_all("//td[@class='td3']//img") %>% 
  xml_attr("src")

vereadores <- read_html(u_ver) %>% 
  xml_find_first('//table') %>% 
  html_table(header = TRUE) %>% 
  janitor::clean_names() %>% 
  as_tibble() %>% 
  mutate(partido = partidos,
         foto = foto_vereador,
         vereador = str_to_title(vereador))

Frequência dos veradores

A página de frequência dos vereadores é a que se diferencia um pouco mais das anteriores. Ela solicita uma requisição POST e os parâmetros de consulta são definidos em Request, em que os parâmetros variáveis são "ano" e "mes".

Obtida a página, os resultados são apresentados no formato de tabela, assim como nas demais. No entanto, o nome das colunas não é retornado na tabela obtida, sendo necessário buscá-los por meio da classe dos nodes: xml_find_all("//td[contains(@class, 'azul-claro')]

u <- "http://www.camara.rj.gov.br/vereadores_frequencia.php?m1=materias_leg&m2=freq"
# url base
b <- list(
        "ano" = ano, # definido de forma numérica
        "mes" = paste0(n_mes, "|", mes), # utiliza o formato (número do mês)|(nome do mês), por exemplo: "2|Fevereiro"
        "sessao" = 1, # não muda
        "submit" = "Consultar" # não muda; realiza a consulta
    )
# Parâmetros do corpo da requisição    
    r <- POST(u, body = b)
    t <- read_html(r) %>% 
        xml_find_first('//table') %>% 
        html_table(fill = TRUE)
    faltas <- t %>% 
            as_tibble() %>% 
            set_names(xml_find_all(
                read_html(r), 
                    "//td[contains(@class, 'azul-claro')]") %>% # busca pelo título
                    html_text() %>%     # das colunas, extrai o texto e "limpa" com
                    str_squish()        # o str_squish()
                ) %>% 
            janitor::clean_names() %>%  
            slice(-1) %>%  # elimina a primeira linha que não contém informações
            mutate(ano = ano, # cria uma coluna com o ano da consulta
                   nome_mes = str_to_lower(mes), # cria uma coluna com o nome do mes da consulta e passa para lowercase
                   mes = n_mes, # cria uma coluna com o numero do mes da consulta
                   faltas = as.double(faltas), 
                   faltas_abonadas = as.double(faltas_abonadas),
                   total_de_faltas = as.double(total_de_faltas))
        # por fim, transforma as colunas com o numero de faltas em double

Apresentação dos dados

Vereadores atuais (2017-2020)

foto vereador partido sala telefone e_mail
Alexandre Isquierdo DEM Anexo 803 3814-2406/2200/2220
Átila A. Nunes DEM Anexo 706 3814-2136 / 2139 / 2010
Babá PSOL Anexo 903 3814-2429
Carlo Caiado DEM Anexo 1003 3814-2081 a 2083/2513/2514
Carlos Bolsonaro REPUBLICANOS Anexo 905 3814-2117 a 2119 /2717
Cesar Maia DEM Palácio 31-B 3814-2331/2735/2485/2492/2592/2484/2476
Dr. Carlos Eduardo PODE Palácio 32-B 3814-2328/2434/2490/2773/2469/2491
Dr. Gilberto PTC Palácio 38-B 3814-2131 / 2133 / 2134
Dr. Jairinho SOLIDARIEDADE Anexo 406 3814-2147 / 2218 / 2296 / 2375 / 2376
Dr. João Ricardo PSC Anexo 802 3814-2246 / 2944 / 2418
Dr. Jorge Manaia PROGRESSISTAS Anexo 801 3814-2140/2143/2144/2563
Dr. Marcos Paulo PSOL Anexo 702 3814-2441 / 2444 / 2935
Eliseu Kessler PSD Anexo 904 3814-2102/2103/2105 /2050
Fátima Da Solidariedade SOLIDARIEDADE Anexo 701 3814-2176 / 2238
Felipe Michel PROGRESSISTAS Anexo 705 3814-2069/2749/2901/2903/2905/
Fernando William PDT Anexo 1005 3814-2011/2157/2531/2543
Inaldo Silva REPUBLICANOS Anexo 501 3814-2607/2609/2178
Italo Ciba AVANTE Anexo 1004 3814-2158/2159/2162/2270 e 2034
Jair Da Mendes Gomes PROS Anexo 305 3814-2231/2232/2456/2457
João Mendes De Jesus REPUBLICANOS Anexo 306 3814-2009 / 2057 / 2061 / 2333
Jones Moura PSD Anexo 804 3814-2570/2571
Jorge Felippe DEM Anexo 505 3814-2001 a 2004 / 2271
Junior Da Lucinha PL Anexo 901 3814-2451/2455/2500/2669
Leandro Lyra REPUBLICANOS Anexo 601 3814-2088/2089/2091
Leonel Brizola PSOL Anexo 806 3814-2125/2180/2412
Luciana Novaes PT Palácio 14-A 3814-2511 e 2598.
Luiz Carlos Ramos Filho PMN Anexo 504 3814-2005 / 2007 / 2387
Major Elitusalem PSC Anexo 604 3814-2498 / 2585 / 2237 / 2475 / 2043 NA
Marcelino D Almeida PROGRESSISTAS Anexo 602 3814-2183 a 2185/2448/2515
Marcello Siciliano PROGRESSISTAS Anexo 401 3814-2073/2179/2722
Marcelo Arar PTB Anexo 506 3814-2030/2045/2046
Paulo Messina MDB Anexo 404 3814-2545
Paulo Pinheiro PSOL Anexo 1002 3814-2393/2068/2920/2463
Prof.célio Lupparelli DEM Anexo 906 3814-2036 à 2038 /2746/2760/2072
Professor Adalmir PROGRESSISTAS Anexo 1006 3814-2086/2087/2170/2365
Rafael Aloisio Freitas CIDADANIA Anexo 403 3814-2024
Reimont PT Anexo 302 3814-2113 a 2115 / 2394
Renato Cinco PSOL Anexo 503 3814-2026 a 2029 / 2008
Renato Moura PATRIOTA Anexo 303 3814-2401/2461/2446/2449
Rocal PSD Anexo 402 3814-2127 / 2128 / 2131 / 2442
Rosa Fernandes PSC Anexo 304 3814-2065 a 2067/2255
Tânia Bastos REPUBLICANOS Anexo 301 3814-2097 a 2099/2512
Tarcísio Motta PSOL Anexo 902 3814-2330/2051
Teresa Bergher CIDADANIA Anexo 405 3814-2053/ 2054/ 2055/ 2056/ 2229/ 2389/ 2391
Thiago K. Ribeiro DEM Anexo 1001 3814-2381/2383/2384
Vera Lins PROGRESSISTAS Anexo 606 3814-2187/2587/2579/2433
Veronica Costa DEM Anexo 605 3814-2580 / 2590
Welington Dias PDT Anexo 502 3814-2070 / 2094 / 2497 /
Willian Coelho DC Anexo 603 3814-2154 a 2156
Zico REPUBLICANOS Anexo 805 3814-2167 a 2169/2172
Zico Bacana PODE Anexo 703 3814-2017 / 2078 / 2018 / 2019

Frequencia

Tabela geral

## Warning: package 'reactable' was built under R version 4.0.3
## Warning: 3 parsing failures.
##   row col   expected    actual                  file
## 15362  -- 10 columns 1 columns 'atv_parlam_full.csv'
## 17633  -- 10 columns 1 columns 'atv_parlam_full.csv'
## 21802  -- 10 columns 1 columns 'atv_parlam_full.csv'